home *** CD-ROM | disk | FTP | other *** search
- #include <stdlib.h>
- #include "wimp.h"
- #include "wimpt.h"
- #include "win.h"
- #include "event.h"
- #include "baricon.h"
- #include "sprite.h"
- #include "werr.h"
- #include "res.h"
- #include "resspr.h"
- #include "flex.h"
- #include "template.h"
- #include "bbc.h"
- #include "colourtran.h"
- #include "os.h"
- #include "dbox.h"
- #include "saveas.h"
- #include "Wallpaper.h" /* constants and external declarations of assembler function */
-
- enum iconbar_menu_entries
- {
- iconbar_Info = 1,
- iconbar_Save,
- iconbar_Freeze,
- iconbar_Quit
- };
-
- static spr_details my_sprite; /* Sprite in which to render */
- static wimp_w displaywin_handle; /* Window for wallpaper */
- static menu iconbar_menu; /* Iconbar menu */
- static BOOL displaying = FALSE; /* Window on display? */
- static BOOL frozen = FALSE; /* Window display frozen? */
- static sprite_pixtrans translate[16], *pixtrans;
- /*==================================================================*/
- static void create_sprite(spr_details *my_sprite)
- {
- sprite_ptr ptr;
- if (flex_alloc((flex_ptr)&my_sprite->area, SpriteSize) == 0)
- werr(TRUE, "Fatal error - failed to allocate store for sprite");
- sprite_area_initialise(my_sprite->area, SpriteSize);
- /* create a sprite within that area */
- wimpt_complain(sprite_create(my_sprite->area, "sprite",
- sprite_nopalette, SpriteWidth, SpriteHeight, SpriteMode));
- my_sprite->id.tag = sprite_id_name;
- my_sprite->id.s.name = "sprite";
- /* select the sprite and get a pointer to it (faster) */
- wimpt_complain(sprite_select_rp(my_sprite->area, &my_sprite->id, &ptr));
- my_sprite->id.tag = sprite_id_addr;
- my_sprite->id.s.addr = ptr;
- }
- /*==================================================================*/
- static void create_displaywin(wimp_w *handle)
- {
- wimp_wind *window;
- /* find template for our window and create a window from it */
- window = template_syshandle("MainWindow");
- wimp_create_wind(window, handle);
- }
- /*==================================================================*/
- static void redo_window(wimp_redrawstr r, BOOL *more)
- {
- int sx = SpriteHeight<<2;
- sprite_factors factors;
-
- /* Ask how the WIMP would scale this sprite */
- /* In 4bpp modes pix trans table is not used */
- wimp_readpixtrans(my_sprite.area, &my_sprite.id, &factors, translate);
- while (*more)
- {
- wimpt_complain(sprite_put_scaled(my_sprite.area, &my_sprite.id, 0,
- r.box.x0-r.scx, r.box.y1-r.scy-sx, &factors, pixtrans));
- wimp_get_rectangle(&r, more);
- }
- }
- /*==================================================================*/
- static void redraw_window(wimp_w handle)
- {
- BOOL more;
- wimp_redrawstr r;
- r.w = handle;
- wimp_redraw_wind(&r, &more);
- if (more) redo_window(r, &more);
- }
- /*==================================================================*/
- static void update_window(void)
- {
- wimp_wstate state;
- wimp_redrawstr r;
- BOOL more;
-
- wimpt_complain(wimp_get_wind_state(displaywin_handle, &state));
- r.w = displaywin_handle;
- r.box.x0 = state.o.x;
- r.box.x1 = state.o.x+(state.o.box.x1-state.o.box.x0);
- r.box.y0 = state.o.y-(state.o.box.y1-state.o.box.y0);
- r.box.y1 = state.o.y;
- wimp_update_wind(&r, &more);
- if (more) redo_window(r, &more);
- }
- /*==================================================================*/
- static void leftclickproc(wimp_i i)
- {
- wimp_wstate state;
- wimp_redrawstr r;
- IGNORE(i);
- if (!displaying)
- {
- wimpt_noerr(wimp_get_wind_state(displaywin_handle, &state));
- state.o.behind = -1; /* open in front */
- wimp_open_wind(&state.o);
- r.w = displaywin_handle; /* force a redraw of the whole window */
- r.box.x0 = 0;
- r.box.x1 = (SpriteWidth <<1);
- r.box.y0 = -(SpriteHeight<<2);
- r.box.y1 = 0;
- wimp_force_redraw(&r);
- displaying = TRUE;
- }
- }
- /*==================================================================*/
- static void animate_wallpaper()
- {
- static size=WALLPAPER_MAXSIZE, d=-1;
- if (size<1 || size>WALLPAPER_MAXSIZE) d=-d;
- size += d;
- Wallpaper( size, my_sprite.id.s.addr);
- update_window();
- }
- /*==================================================================*/
- static void handler(wimp_eventstr *e, void *handle)
- {
- handle = handle;
- switch (e->e)
- {
- case wimp_ENULL:
- if(displaying) animate_wallpaper();
- break;
- case wimp_EREDRAW:
- redraw_window(e->data.o.w);
- break;
- case wimp_EOPEN:
- wimp_open_wind(&e->data.o);
- break;
- case wimp_ECLOSE:
- wimpt_noerr(wimp_close_wind(e->data.o.w));
- displaying = FALSE;
- break;
- case wimp_ESEND:
- case wimp_ESENDWANTACK: /* this code checks for mode/palette broadcasts */
- switch(e->data.msg.hdr.action)
- {
- case wimp_MMODECHANGE:
- wimpt_checkmode();
- pixtrans = (wimpt_bpp()==4) ? 0 : translate;
- /* no break, drops down */
- case wimp_PALETTECHANGE:
- wimpt_complain(colourtran_select_table(SpriteMode, 0, -1,
- (wimp_paletteword *)-1, translate));
- break;
- }
- }
- }
- /*==================================================================*/
- static void info_aboutprog(void)
- {
- dbox d = dbox_new("ProgInfo");
- if (d==0) return;
- dbox_show(d);
- dbox_fillin(d);
- dbox_dispose(&d);
- }
- /*==================================================================*/
- static BOOL saver(char *filename, void *handle)
- {
- IGNORE(handle);
- return !wimpt_complain(sprite_area_save(my_sprite.area, filename));
- }
- /*==================================================================*/
- static void menuproc(void *handle, char *hit)
- {
- IGNORE(handle);
- switch(hit[0])
- {
- case iconbar_Info:
- info_aboutprog();
- break;
- case iconbar_Save:
- saveas(SpriteFile, "Wallpaper", SpriteSize, saver,0,0,0);
- break;
- case iconbar_Freeze:
- event_setmask(frozen^=1 ? event_getmask() | wimp_EMNULL :
- event_getmask() &~wimp_EMNULL );
- menu_setflags(iconbar_menu, iconbar_Freeze, frozen, 0);
- break;
- case iconbar_Quit:
- exit(0);
- break;
- }
- }
- /*==================================================================*/
- static void initialise(void)
- {
- wimpt_init("Wallpaper");
- res_init("Wallpaper");
- resspr_init();
- flex_init();
- template_init();
- dbox_init();
-
- wimpt_checkmode();
- pixtrans = (wimpt_bpp()==4) ? 0 : translate;
- wimpt_complain(colourtran_select_table(SpriteMode,0,-1,
- (wimp_paletteword *)-1, translate));
-
- create_sprite(&my_sprite);
- create_displaywin(&displaywin_handle);
- win_register_event_handler(displaywin_handle, handler, 0);
- win_claim_idle_events(displaywin_handle);
- win_claim_unknown_events(displaywin_handle);
-
- baricon("!Wallpaper", 1, leftclickproc);
- iconbar_menu = menu_new("Wallpaper", ">Info,>Save,Freeze,Quit");
- event_attachmenu(win_ICONBAR, iconbar_menu, menuproc, 0);
- }
- /*==================================================================*/
- int main()
- {
- initialise();
- event_setmask(wimp_EMPTRENTER | wimp_EMPTRLEAVE);
- for (;;)
- event_process();
- }
- /*==================================================================*/
-